#!/bin/bash

main(){
    clear
    cat << EOF
# 版权所有 (C) 2024 - 2099 东港市云港网络科技工作室
# 保留所有权利。
#
# 本脚本按“原样”提供，没有任何形式的保证，无论是明示的还是暗示的。因使用本脚本而产生的任何损害，作者概不负责。
#
# 本脚本仅限个人、教育和非商业用途使用。
#
# 如果你是购买而来，脚本内容可能已经被修改，请立即重装系统，并举报此商家！
# 作者: 孙子烧烤（www.sunzishaokao.com）
EOF
    sleep 3
    verifySystemCompatibility
}

# 环境检查
verifySystemCompatibility(){
    # 检查是否以root身份运行
    if [ "$(id -u)" -ne 0 ]; then
        echo "Error：请以root身份运行本脚本。"
        qrcode
        exit 1
    fi

    # 更新软件包列表
    if ! sudo apt-get update; then
        echo "更新软件包列表失败，请检查网络连接或APT配置。" >&2
        exit 1
    fi

    # 安装 qrencode
    if ! sudo apt-get install -y qrencode; then
        echo "安装 qrencode 失败，请检查APT权限或软件仓库。" >&2
        exit 1
    fi

    # 检查操作系统是否为 Debian 或 Ubuntu
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        if [[ "$ID" != "debian" && "$ID" != "ubuntu" ]]; then
            echo "Error：此脚本仅支持 Debian 和 Ubuntu 系统。"
            qrcode
            exit 1
        fi
    else
        echo "无法确定操作系统类型。"
        qrcode
        exit 1
    fi

    # 检查 kubectl 和 containerd 是否已安装
    if command -v kubectl &> /dev/null && command -v ctr &> /dev/null; then
        echo "Error：您已经安装过Kubernetes或containerd"
        qrcode
        exit 1
    else
        echo "未检测到Kubernetes或containerd，开始安装..."
        install
    fi
}

# 安装过程
install(){
    echo "请输入主节点地址："
    read -r master_ip
    echo "请输入主节点名称："
    read -r master_name
    echo "请输入从节点数量："
    read -r node_count
    declare -a node_ips
    declare -a node_names
    for ((i=1; i<=node_count; i++)); do
        echo "请输入从节点$i地址："
        read -r node_ips[$i]
        echo "请输入从节点$i名称："
        read -r node_names[$i]
    done
    clear

    echo "修改hosts文件..."
    host "$node_count" "${node_ips[@]}" "${node_names[@]}"
    
    if [ $? -ne 0 ]; then
        echo "修改hosts文件失败"
        qrcode
        exit 1
    fi
    echo "环境准备：禁用UFW防火墙..."
    systemctl disable --now ufw
    if [ $? -ne 0 ]; then
        echo "禁用UFW防火墙失败"
        qrcode
        exit 1
    fi
    echo "环境准备：禁用SWAP..."
    swap
    if [ $? -ne 0 ]; then
        echo "禁用SWAP失败"
        qrcode
        exit 1
    fi
    echo "环境准备：设置时区..."
    set_timezone
    if [ $? -ne 0 ]; then
        echo "设置时区失败"
        qrcode
        exit 1
    fi
    echo "环境准备：禁用SELINUX..."
    test_selinux
    if [ $? -ne 0 ]; then
        echo "禁用SELINUX失败"
        qrcode
        exit 1
    fi
    clear

    # 安装containerd容器
    echo "下面开始安装，整个安装过程可能比较慢，如遇到界面卡死，请不要操作，耐心等待即可！"
    sleep 3
    echo "安装步骤：正在安装containerd...（预计需要5分钟）"
    apt-get update
    apt-get install -y containerd
    mkdir -p /etc/containerd
    containerd config default > /etc/containerd/config.toml
    systemctl restart containerd
    systemctl enable containerd
    sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
    sed -i 's/gcr.io/registry.aliyuncs.com/g' /etc/containerd/config.toml
    clear

    # 安装kubeadm、kubelet和kubectl
    echo "安装步骤：正在安装Kubernetes组件..."
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.28/deb/ /" > /etc/apt/sources.list.d/kubernetes.list
    apt-get update
    apt-get install -y kubelet kubeadm kubectl
    apt-mark hold kubelet kubeadm kubectl

    # 创建集群-Pull镜像
    echo "安装步骤：正在拉取Kubernetes镜像...（预计需要3分钟）"
    kubeadm config images pull \
    --image-repository=registry.aliyuncs.com/google_containers \
    --kubernetes-version=$git_version \
    --cri-socket=unix:///run/containerd/containerd.sock
    if [ $? -ne 0 ]; then
        echo "Error: 镜像Pull失败."
        qrcode
        exit 1
    fi
    clear

    # 初始化集群
    echo "安装步骤：正在初始化Kubernetes集群...（预计需要5分钟）"
    kubeadm init \
    --apiserver-advertise-address=${master_ip} \
    --image-repository=registry.aliyuncs.com/google_containers \
    --kubernetes-version=${git_version} \
    --service-cidr=10.96.0.0/12 \
    --pod-network-cidr=10.244.0.0/16 \
    --cri-socket=unix:///run/containerd/containerd.sock | tee kubeadm-init-output.txt
    join_command=$(grep -A 1 "kubeadm join" kubeadm-init-output.txt | tail -n 1)

    # 完成安装
    clear
    echo "安装完成：请在从节点执行: $join_command"
    qrcode
    # 删除临时文件
    echo "正在清理临时文件..."
    rm -f kubeadm-init-output.txt
}

# 群聊二维码
qrcode() {
    qrencode -t ansi256 "https://work.weixin.qq.com/gm/71eb194af1ba02f2c6461d864cc5cda1"
    echo "如遇到问题。请到微信交流群中反馈↑↑↑"
}

# 获取 kubeadm 版本信息
get_kubeadm_version() {
    # 执行 kubeadm version 命令
    local kubeadm_output=$(kubeadm version)

    # 检查命令是否成功执行
    if [ $? -ne 0 ]; then
        echo "Error: 未获取到kubeadm version版本."
        qrcode
        exit 1
    fi

    # 使用正则表达式提取 gitVersion
    local git_version=$(echo "$kubeadm_output" | grep -oP 'gitVersion:\s+"?\K[^"\s]+')

    # 检查是否提取到版本信息
    if [ -z "$git_version" ]; then
        echo "Error: 未获取到gitVersion 版本."
        qrcode
        exit 1
    fi

    # 返回 gitVersion
    echo "$git_version"
}

# 修改hosts文件
host(){
    local node_count=$1
    shift
    local node_ips=("$@")
    local node_names=("${node_ips[@]:$node_count}")

    sed -i "s/127.0.0.1 ${master_name}/#127.0.0.1 ${master_name}/" /etc/hosts
    for ((i=1; i<=node_count; i++)); do
        echo "${node_ips[$i]} ${node_names[$i]}" >> /etc/hosts
    done
}

# 禁用虚拟内存
swap(){
    echo "禁用swap..."
    swapoff -a
    sed -i '/swap/d' /etc/fstab
}

# 设置时区
set_timezone() {
    # 设置时区
    if ! timedatectl set-timezone Asia/Shanghai; then
        echo "Error: 设置时区失败."
        qrcode
        exit 1
    fi

    # 重启服务
    if ! systemctl restart systemd-timesyncd.service; then
        echo "Error: 重启时间服务失败."
        qrcode
        exit 1
    fi

    # 显示状态
    timedatectl status
}

# 禁用SELINUX
selinux() {
    # 安装policycoreutils软件包
    echo "正在安装policycoreutils..."
    if ! apt-get update; then
        echo "Error：更新APT源失败，请检查网络连接或APT配置。"
        return 1
    fi
    apt-get install -y policycoreutils

    # 检查SELinux关闭状态
    echo "检查SELinux状态..."
    sestatus
    if [ $? -ne 0 ]; then
        echo "Error：检查SELinux状态失败。"
        return 1
    fi

    # 设置SELinux为禁用状态
    echo "设置SELinux为禁用状态..."
    if ! sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config; then
        echo "Error：设置SELinux配置文件失败。"
        return 1
    fi
    if ! setenforce 0; then
        echo "Error：设置SELinux强制模式失败。"
        return 1
    fi
}

# 测试SELinux禁用函数
test_selinux() {
    selinux
    if [ $? -eq 0 ]; then
        echo "SELinux禁用成功。"
    else
        echo "Error：SELinux禁用失败。"
        exit 1
    fi
}

# 设置iptables桥接
iptables(){
    K8S_CONF_CONTENT="overlay
    br_netfilter"

    echo -e "$K8S_CONF_CONTENT" > /tmp/k8s.conf.tmp
    if ! mv /tmp/k8s.conf.tmp /etc/modules-load.d/k8s.conf; then
        echo "Error：k8s.conf写入失败."
        return 1
    fi

    modprobe overlay
    modprobe br_netfilter

    SYSCTL_CONTENT="
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward = 1"

    echo -e "$SYSCTL_CONTENT" | sudo tee /etc/sysctl.d/k8s.conf
    sysctl --system

    if ! lsmod | grep -q br_netfilter; then
        echo "Error：br_netfilter 没有加载."
        return 1
    fi

    if ! lsmod | grep -q overlay; then
        echo "Error：overlay 没有加载."
        return 1
    fi

    sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
}
main